/*********************************************************************************************
    *   Filename        : ble_api.h

    *   Description     :

    *   Author          : mx

    *   Email           : lmx@zh-jieli.com

    *   Last modifiled  : 2020-07-01 16:36

    *   Copyright:(c)JIELI  2011-2020  @ , All Rights Reserved.
*********************************************************************************************/
#ifndef __BLE_API_H__
#define __BLE_API_H__


#include "typedef.h"
#include "btstack/btstack_typedef.h"


///***注意：该文件的枚举与库编译密切相关，主要是给用户提供调用所用。用户不能自己在中间添加值。*/
////----user (command) codes----////

/**
 * @brief hci connection handle type
 */

typedef enum {
    /*
     */
    BLE_CMD_ADV_ENABLE  = 1,
    BLE_CMD_ADV_PARAM,
    BLE_CMD_ADV_DATA,
    BLE_CMD_RSP_DATA,
    BLE_CMD_DISCONNECT,
    BLE_CMD_REGIEST_THREAD,
    BLE_CMD_ATT_SEND_INIT,
    BLE_CMD_ATT_MTU_SIZE,
    BLE_CMD_ATT_VAILD_LEN,
    BLE_CMD_ATT_SEND_DATA,
    BLE_CMD_REQ_CONN_PARAM_UPDATE,

    BLE_CMD_SCAN_ENABLE,
    BLE_CMD_SCAN_PARAM,
    BLE_CMD_STACK_EXIT,
    BLE_CMD_CREATE_CONN,
    BLE_CMD_CREATE_CONN_CANCEL,

    BLE_CMD_ADV_PARAM_EXT,
    BLE_CMD_SEND_TEST_KEY_NUM,
    BLE_CMD_LATENCY_HOLD_CNT,
    BLE_CMD_SET_DATA_LENGTH,
    BLE_CMD_SET_HCI_CFG,
    BLE_CMD_SCAN_ENABLE2,
    BLE_CMD_ATT_SERVER_REQ_RESUME,

    //MULTI API,多机接口
    BLE_CMD_MULTI_ATT_SEND_INIT,
    BLE_CMD_MULTI_ATT_SET_CONN_HANDLE,
    BLE_CMD_MULTI_ATT_SEND_DATA,
    BLE_CMD_MULTI_ATT_MTU_SIZE,
    BLE_CMD_MULTI_ATT_VAILD_LEN,

    //< ble5
    BLE_CMD_EXT_ADV_PARAM = 0x40,
    BLE_CMD_EXT_ADV_DATA,
    BLE_CMD_EXT_RSP_DATA,
    BLE_CMD_EXT_ADV_ENABLE,
    BLE_CMD_SET_PHY,
    BLE_CMD_EXT_SCAN_PARAM,
    BLE_CMD_EXT_SCAN_ENABLE,
    BLE_CMD_EXT_CREATE_CONN,
    BLE_CMD_PERIODIC_ADV_PARAM,
    BLE_CMD_PERIODIC_ADV_DATA,
    BLE_CMD_PERIODIC_ADV_ENABLE,
    BLE_CMD_PERIODIC_ADV_CREAT_SYNC,

    //client
    BLE_CMD_SEARCH_PROFILE = 0x80,
    BLE_CMD_WRITE_CCC,
    BLE_CMD_ONNN_PARAM_UPDATA,
} ble_cmd_type_e;

typedef enum {
    BLE_CMD_RET_SUCESS =  0, //执行成功
    BLE_CMD_RET_BUSY = -100, //命令处理忙
    BLE_CMD_PARAM_OVERFLOW,  //传数溢出
    BLE_CMD_OPT_FAIL,        //操作失败
    BLE_BUFFER_FULL,         //缓存满了
    BLE_BUFFER_ERROR,        //缓存出错
    BLE_CMD_PARAM_ERROR,     //传参出错
    BLE_CMD_STACK_NOT_RUN,   //协议栈没有运行
    BLE_CMD_CCC_FAIL,        //没有使能通知，导致NOTIFY或INDICATE发送失败，
} ble_cmd_ret_e;

//--------------------------------------------
ble_cmd_ret_e ble_user_cmd_prepare(ble_cmd_type_e cmd, int argc, ...);

struct conn_update_param_t {
    u16 interval_min;  //(unit:0.625ms)
    u16 interval_max;  //(unit:0.625ms)
    u16 latency;       //(unit: interval)
    u16 timeout;       //(unit:10ms)
};

typedef enum {
    PFL_SERVER_UUID16 = 1, //指定16bit UUID搜索方式
    PFL_SERVER_UUID128,    //指定128bit UUID搜索方式
    PFL_SERVER_ALL,        //搜索所有的UUID
} search_profile_type_e;


//------
struct create_conn_param_t {
    u16 conn_interval;        //0--public address,1--random address
    u16 conn_latency;         //(unit: interval)
    u16 supervision_timeout;  //(unit:10ms)
    u8 peer_address_type;     //0--public address,1--random address
    u8 peer_address[6];
} _GNU_PACKED_;

typedef struct {
    u8   event_type;    //0--ADV_IND,1--ADV_DIRECT_IND,2--ADV_SCAN_IND,3--ADV_NONCONN_IND,4--SCAN_RSP
    u8   address_type;  //0--public address,1--random address
    u8   address[6];    //peer_address
    s8   rssi;          //range:-127 ~128 dbm
    u8   length;        //广播包长度
    u8   data[0];       //广播包内容
} adv_report_t;

typedef struct {
    //base info
    u8   type;       //< See <btstack/hci_cmds.h> SM_...
    u8   size;
    u16  con_handle; //connection 's handle, >0
    u8   addr_type;  //0--public address,1--random address
    u8   address[6];
    //extend info
    u8   data[4];
} sm_just_event_t;

//BLE_CMD_SET_HCI_CFG
typedef enum {
    HCI_CFG_OWN_ADDRESS_TYPE =  0, //
    HCI_CFG_ADV_FILTER_POLICY, //
    HCI_CFG_SCAN_FILTER_POLICY, //
    HCI_CFG_INITIATOR_FILTER_POLICY, //
    //add here
} hci_cfg_par_e;

typedef enum {
    REMOTE_TYPE_UNKNOWN  = 0,//未查询or查询对方未响应
    REMOTE_TYPE_ANDROID,
    REMOTE_TYPE_IOS,
} remote_type_e;

//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------

/**********************************************************************************
   @function gatt client 角色 初始化
   @return
 *********************************************************************************/
void gatt_client_init(void);

/**********************************************************************************
   @function 注册gatt client 角色,事件回调处理
   @param [in] handler      事件处理函数
   @return
 *********************************************************************************/
void gatt_client_register_packet_handler(btstack_packet_handler_t handler);

/**********************************************************************************
   @function 初始化配对表
   @param [in]
   @return
   note:上电初始化一次
 *********************************************************************************/
void le_device_db_init(void);

/**********************************************************************************
   @function 注册passkey 输入回调
   @param [in]
   @return
 *********************************************************************************/
void reset_PK_cb_register(void (*reset_pk)(u32 *));

/**********************************************************************************
   @function 设置ble的蓝牙public地址
   @param [in] addr
   @return 0--success ,非0--fail
   note:可以结合接口 ble_op_set_own_address_type 配置选择地址类型
   note:修改地址必须在ble非工作状态下才能生效（没有scan,没有adv,没connected）
 *********************************************************************************/
int le_controller_set_mac(void *addr);

/**********************************************************************************
   @function 获取ble的蓝牙public地址
   @param [out] addr
   @return 0--success ,非0--fail
 *********************************************************************************/
int le_controller_get_mac(void *addr);

/**********************************************************************************
   @function 初始化ble的蓝牙random地址
   @param [in] addr
   @return 0--success ,非0--fail
   note:可以结合接口 ble_op_set_own_address_type 配置选择地址类型
   note:修改地址必须在ble非工作状态下才能生效（没有scan,没有adv,没connected）
 *********************************************************************************/
int le_controller_set_random_mac(void *addr);

/**********************************************************************************
   @function 获取ble的蓝牙random地址
   @param [out] addr
   @return 0--success ,非0--fail
 *********************************************************************************/
int le_controller_get_random_mac(void *addr);

/**********************************************************************************
   @function 配置协议栈 GATT 角色处理,default server
   @param [in] role   0--server, or 1--client,or 2--server+client
   @return
 *********************************************************************************/
void ble_stack_gatt_role(u8 role);

/**********************************************************************************
   @function client 连接后初始化
   @param [in] handle   连接 con_handle,range：>0
   @param [in] buffer 配置缓存地址
   @param [in] buffer_size 缓存大小
   @return
 *********************************************************************************/
void user_client_init(u16 handle, u8 *buffer, u16 buffer_size);

/**********************************************************************************
   @function 获取链路对方的信号强度
   @param [in] con_handle 连接handle, range：>0
   @return  rssi 强度， range:-127 ~128 dbm
 *********************************************************************************/
s8 ble_vendor_get_peer_rssi(u16 conn_handle);

/**********************************************************************************
   @function 使能周期interval事件上报
   @param [in] con_handle  连接handle, range：>0
   @param [in] enable      1 or 0
   @return  true or false
 *********************************************************************************/
bool ble_vendor_interval_event_enable(u16 conn_handle, int enable);


/**********************************************************************************
   @function 配置协议栈ATT默认的MTU 大小
   @param [in] mtu_size, range: 23~517
   @return  配置后的mtu_size值
 *********************************************************************************/
u16 ble_vendor_set_default_att_mtu(u16 mtu_size);

/**********************************************************************************
   @function 设置 搜索结束
   @param [in]
   @return
 *********************************************************************************/
void user_client_set_search_complete(void);

/**********************************************************************************
   @function 提供生成 ble对应的类型地址
   @param [out] address
   @param [in] type
   1--STATIC_DEVICE_ADDR
   2--NON_RESOLVABLE_PRIVATE_ADDR
   3--RESOLVABLE_PRIVATE_ADDR
   @return
 *********************************************************************************/
void ble_vendor_address_generate(u8 *address, u8 type);

/**********************************************************************************
   @function 根据提供的edr地址生成唯一对应ble地址
   @param [out] ble_address
   @param [in]  edr_address
   @return
 *********************************************************************************/
void lib_make_ble_address(u8 *ble_address, u8 *edr_address);

/**********************************************************************************
   @function 配置设备的地址类型，默认为 0--public address
   @param [in] address_type   Range: 0x00 to 0x03
   @return  see ble_cmd_ret_e
   !!!注意：设置的时候必须在 设置广播参数 或者扫描参数 或者创建连接参数 前配置好
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_own_address_type(u8 address_type) */
#define ble_op_set_own_address_type(address_type)     \
	ble_user_cmd_prepare(BLE_CMD_SET_HCI_CFG, 2,HCI_CFG_OWN_ADDRESS_TYPE,(int)address_type)

/**********************************************************************************
   @function 开关BLE广播， !!!注意：开广播前必现先配置好广播的参数
   @param [in] enable   0 or 1
   @return  see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_adv_enable(int enable) */
#define ble_op_adv_enable(enable)     \
	ble_user_cmd_prepare(BLE_CMD_ADV_ENABLE, 1, (int)enable)

/**********************************************************************************
   @function 配置adv filter policy, default 0
   @param [in] type   Range: 0x00 to 0x03
   @return  see ble_cmd_ret_e
   !!!注意：设置的时候必须在 设置广播参数 前配置好
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_adv_filter_policy(u8 type) */
#define ble_op_set_adv_filter_policy(type)     \
	ble_user_cmd_prepare(BLE_CMD_SET_HCI_CFG, 2,HCI_CFG_ADV_FILTER_POLICY,type)

/**********************************************************************************

   @function 配置广播参数，!!!注意：设置的时候必现在广播关闭的状态下
   @param [in] adv_interval     广播周期，Range: 0x0020 to 0x4000 (unit: 0.625ms)
   @param [in] adv_type         广播类型，Range: 0x00 to 0x04
   @param [in] adv_channel      广播类型通道，range:Range: 0x01 to 0x07
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_adv_param(u16 adv_interval,u8 adv_type) */
#define ble_op_set_adv_param(adv_interval,adv_type,adv_channel)     \
	ble_user_cmd_prepare(BLE_CMD_ADV_PARAM, 3, (int)adv_interval, (int)adv_type, (int)adv_channel)


/**********************************************************************************
   @function 配置广播参数，!!!注意：设置的时候必现在广播关闭的状态下
   @param [in] adv_interval     广播周期，Range: 0x0020 to 0x4000 (unit: 0.625ms)
   @param [in] adv_type         广播类型，Range: 0x00 to 0x04
   @param [in] adv_channel      广播类型通道，range:Range: 0x01 to 0x07
   @param [in] peer_info        (全局变量地址)，定向广播时，填入对方的地址信息，
                                peer_info[0]--地址类型range 0~1，peer_info[1~7]--地址内容
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_adv_param_ext(u16 adv_interval,u8 adv_type,u8 adv_channel,const u8 *peer_info) */
#define ble_op_set_adv_param_ext(adv_interval,adv_type,adv_channel,peer_info)     \
	ble_user_cmd_prepare(BLE_CMD_ADV_PARAM_EXT, 4, (int)adv_interval, (int)adv_type, (int)adv_channel, (void*)peer_info)


/**********************************************************************************

   @function 配置广播 Advertising Data内容，!!!注意：设置的时候必现在广播关闭的状态下
   @param [in] adv_len         adv 数据包长度，Range: 0x00 to 0x1f
   @param [in] adv_data        (全局变量地址)，adv数据包地址
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_adv_data(u8 adv_len,const *u8 adv_data) */
#define ble_op_set_adv_data(adv_len,adv_data)     \
	ble_user_cmd_prepare(BLE_CMD_ADV_DATA, 2, (int)adv_len, (void*)adv_data)


/**********************************************************************************

   @function 配置广播 Scan Response Data内容，!!!注意：设置的时候必现在广播关闭的状态下
   @param [in] rsp_len         rsp 数据包长度，Range: 0x00 to 0x1f
   @param [in] rsp_data        (全局变量地址)，rsp数据包地址
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_rsp_data(u8 rsp_len,const *u8 rsp_data) */
#define ble_op_set_rsp_data(rsp_len,rsp_data)     \
	ble_user_cmd_prepare(BLE_CMD_RSP_DATA, 2, (int)rsp_len, (void*)rsp_data)


/**********************************************************************************

   @function 请求断开 ble 连接
   @param [in] con_handle         连接handle，range：>0
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_disconnect(u16 con_handle) */
#define ble_op_disconnect(con_handle)     \
	ble_user_cmd_prepare(BLE_CMD_DISCONNECT, 1, (int)con_handle)

/**********************************************************************************

   @function 配置ATT发送模块RAM大小
   @param [in] con_handle        连接 con_handle,range：>0
   @param [in] att_ram_addr      传入ATT发送模块ram地址，地址按4字节对齐
   @param [in] att_ram_size      传入ATT发送模块ram大小
   @param [in] att_payload_size  发送ATT包payload的最大长度 <= MTU，range：20 to MTU size
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_att_send_init(u16 con_handle,u8 *att_ram_addr,int att_ram_size,int att_payload_size) */
#define ble_op_att_send_init(con_handle,att_ram_addr,att_ram_size,att_payload_size)     \
	ble_user_cmd_prepare(BLE_CMD_ATT_SEND_INIT, 4, con_handle,att_ram_addr,att_ram_size,att_payload_size)


/**********************************************************************************

   @function MULTI API: 配置ATT发送模块初始化
   @param [in] att_ram_addr      传入ATT发送模块ram地址，地址按4字节对齐
   @param [in] att_ram_size      传入ATT发送模块ram大小
   @param [in] att_payload_size  发送ATT包payload的最大长度 <= MTU，range：20 to MTU size
   @return    see ble_cmd_ret_e
   note:多机处理，只需要初始化一次就可以
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_multi_att_send_init(u8 *att_ram_addr,int att_ram_size,int att_payload_size) */
#define ble_op_multi_att_send_init(att_ram_addr,att_ram_size,att_payload_size)     \
	ble_user_cmd_prepare(BLE_CMD_MULTI_ATT_SEND_INIT, 3, att_ram_addr,att_ram_size,att_payload_size)


/**********************************************************************************

   @function MULTI API: 配置ATT 连接handle
   @param [in] con_handle         连接 con_handle,range：>0
   @param [in] handle_index       range:0~7 //多连接的hanlde id
   @param [in] role               range:0-slave,1-master
   @return     see ble_cmd_ret_e
   note:多机处理
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_multi_att_send_conn_handle(u16 con_handle,int handle_index,int role) */
#define ble_op_multi_att_send_conn_handle(con_handle,handle_index,role)     \
	ble_user_cmd_prepare(BLE_CMD_MULTI_ATT_SET_CONN_HANDLE, 3, con_handle,handle_index,role)

/**********************************************************************************

   @function 根据对方的接收MTU大小，配置本地可发送的MTU的大小
   @param [in]mtu  对方mtu payload的大小
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_att_set_send_mtu(u16 mtu) */
#define ble_op_att_set_send_mtu(mtu)     \
	ble_user_cmd_prepare(BLE_CMD_ATT_MTU_SIZE, 1, mtu);


/**********************************************************************************

   @function MULTI API: 根据对方的接收MTU大小，配置本地可发送的MTU的大小
   @param [in] con_handle 连接 con_handle,range：>0
   @param [in] mtu  对方mtu payload的大小
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
   note:多机处理
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_multi_att_set_send_mtu(u16 con_handle,u16 mtu) */
#define ble_op_multi_att_set_send_mtu(con_handle,mtu)     \
	ble_user_cmd_prepare(BLE_CMD_MULTI_ATT_MTU_SIZE, 2, con_handle,mtu);


/**********************************************************************************

   @function 获取ATT发送模块，cbuffer 可写入数据的长度
   @param [out] remain_size_ptr   输出可写入长度值
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_att_get_remain(int *remain_size_ptr) */
#define ble_op_att_get_remain(remain_size_ptr)     \
	ble_user_cmd_prepare(BLE_CMD_ATT_VAILD_LEN, 1, remain_size_ptr)

/**********************************************************************************

   @function MULTI API: 获取ATT发送模块，cbuffer 可写入数据的长度
   @param [in] con_handle 连接 con_handle,range：>0
   @param [out] remain_size_ptr   输出可写入长度值
   @return    see ble_cmd_ret_e
   note:多机处理
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_multi_att_get_remain(u16 con_handle,int *remain_size_ptr) */
#define ble_op_multi_att_get_remain(con_handle,remain_size_ptr)     \
	ble_user_cmd_prepare(BLE_CMD_MULTI_ATT_VAILD_LEN, 2,con_handle, remain_size_ptr)

/**********************************************************************************

   @function   ATT操作handle发送数据
   @param [in] att_handle  att 操handle
   @param [in] data  数据地址
   @param [in] len   数据长度  <= cbuffer 可写入的长度
   @param [in] att_op_type   see  att_op_type_e (att.h)
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_att_send_data(u16 att_handle,u8 *data,u16 len, att_op_type_e att_op_type) */
#define ble_op_att_send_data(att_handle,data,len,att_op_type)     \
	ble_user_cmd_prepare(BLE_CMD_ATT_SEND_DATA, 4, att_handle, data, len, att_op_type)


/**********************************************************************************

   @function  MULTI API: ATT操作handle发送数据
   @param [in] con_handle 连接 con_handle,range：>0
   @param [in] att_handle  att 操handle
   @param [in] data  数据地址
   @param [in] len   数据长度  <= cbuffer 可写入的长度
   @param [in] att_op_type   see  att_op_type_e (att.h)
   @return    see ble_cmd_ret_e
   note:多机处理
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_multi_att_send_data(u16 con_handle,u16 att_handle,u8 *data,u16 len, att_op_type_e att_op_type) */
#define ble_op_multi_att_send_data(con_handle,att_handle,data,len,att_op_type)     \
	ble_user_cmd_prepare(BLE_CMD_MULTI_ATT_SEND_DATA, 5, con_handle,att_handle, data, len, att_op_type)



/**********************************************************************************

   @function   请求更新连接参数
   @param [in] con_handle 连接 con_handle,range：>0
   @param [in] con_param (全局变量地址)，连接参数
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_conn_param_request(u16 con_handle,const struct conn_update_param_t *con_param) */
#define ble_op_conn_param_request(con_handle,con_param)     \
	ble_user_cmd_prepare(BLE_CMD_REQ_CONN_PARAM_UPDATE, 2, con_handle, (void*)con_param)

/**********************************************************************************

   @function  发起data length 交换
   @param [in] tx_octets
   @param [in] tx_time
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_data_length(u16 con_handle,u16 tx_octets,u16 tx_time) */
#define ble_op_set_data_length(con_handle,tx_octets,tx_time)     \
	ble_user_cmd_prepare(BLE_CMD_SET_DATA_LENGTH, 3, con_handle, tx_octets, tx_time)


/**********************************************************************************

   @function  ble5.0 配置 广播参数
   @param [in] param  广播参数
   @param [in] param_len  参数长度
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_ext_adv_param(u8 *param,u16 param_len) */
#define ble_op_set_ext_adv_param(param,param_len)     \
	ble_user_cmd_prepare(BLE_CMD_EXT_ADV_PARAM, 2, param, param_len)

/**********************************************************************************

   @function ble5.0 配置 adv 数据包
   @param [in]data  数据包内容
   @param [in]data_len 数据包长度
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_ext_adv_data(u8 *data,u16 data_len) */
#define ble_op_set_ext_adv_data(data,data_len)     \
	ble_user_cmd_prepare(BLE_CMD_EXT_ADV_DATA, 2, data, data_len)


/**********************************************************************************

   @function ble5.0 配置 respond 数据包
   @param [in]data  数据包内容
   @param [in]data_len 数据包长度
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_ext_rsp_data(u8 *data,u16 data_len) */
#define ble_op_set_ext_rsp_data(data,data_len)     \
	ble_user_cmd_prepare(BLE_CMD_EXT_RSP_DATA, 2, data, data_len)



/**********************************************************************************

   @function ble5.0 开关广播
   @param [in] cmd  命令信息
   @param [in] cmd_len 命令长度
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_ext_adv_enable(u8 *cmd,u16 cmd_le) */
#define ble_op_set_ext_adv_enable(cmd,len)     \
	ble_user_cmd_prepare(BLE_CMD_EXT_ADV_ENABLE, 2, cmd, cmd_len)


/**********************************************************************************

   @function ble5.0 配置phy
   @param [in]con_handle 连接 con_handle,range：>0
   @param [in]all_phys
   @param [in]tx_phy
   @param [in]rx_phy
   @param [in]phy_options
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_ext_phy(u16 con_handle,u16 all_phys,u16 tx_phy,u16 rx_phy,u16 phy_options) */
#define ble_op_set_ext_phy(con_handle,all_phys,tx_phy,rx_phy,phy_options)     \
    ble_user_cmd_prepare(BLE_CMD_SET_PHY, 5, con_handle, all_phys, tx_phy, rx_phy, phy_options)


/**********************************************************************************

   @function  ble5.0 配置 主机scan 参数
   @param [in]param    参数内容
   @param [in]param_len 参数长度
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_ext_scan_param(u8 *param,u16 param_le) */
#define ble_op_set_ext_scan_param(param,param_len)     \
        ble_user_cmd_prepare(BLE_CMD_EXT_SCAN_PARAM, 2, param, param_len)


/**********************************************************************************

   @function  ble5.0 配置 主机scan 开关
   @param [in] cmd  命令信息
   @param [in] cmd_len 命令长度
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_ext_scan_enable(u8 *cmd,u16 cmd_le) */
#define ble_op_ext_scan_enable(cmd,cmd_len)     \
        ble_user_cmd_prepare(BLE_CMD_EXT_SCAN_ENABLE, 2, cmd, cmd_len)


/**********************************************************************************

   @function  ble5.0 配置 主机创建连接监听
   @param [in]conn_param 连接参数信息
   @param [in]param_len 参数长度
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_ext_create_conn(u8 *conn_param,u16 param_len_len) */
#define ble_op_ext_create_conn(conn_param,param_len)     \
    ble_user_cmd_prepare(BLE_CMD_EXT_CREATE_CONN, 2, conn_param, param_len)


/**********************************************************************************

   @function   忽略进入latency 的次数。!!!注意：让设备不进入latency模式，加快响应速度，但会耗电
   @param [in] con_handle 连接 con_handle,range：>0
   @param [in] skip_interval  忽略的interval的次数
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_latency_skip(u16 con_handle,u16 skip_interval) */
#define ble_op_latency_skip(con_handle,skip_interval)     \
	ble_user_cmd_prepare(BLE_CMD_LATENCY_HOLD_CNT, 2, con_handle, skip_interval)

/**********************************************************************************

   @function   测试盒识别按键测试
   @param [in] con_handle 连接 con_handle,range：>0
   @param [in] key_num  按键
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_test_key_num(u16 con_handle,u8 key_num) */
#define ble_op_test_key_num(con_handle,key_num)     \
	ble_user_cmd_prepare(BLE_CMD_SEND_TEST_KEY_NUM, 2, con_handle, key_num)

/**********************************************************************************

   @function   退出ble协议栈
   @param [in] control : 0--退出stack(default),1--退出stack + controller
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_stack_exit(u8 control) */
#define ble_op_stack_exit(control)     \
	ble_user_cmd_prepare(BLE_CMD_STACK_EXIT, 1, control)

/**********************************************************************************

   @function   挂载协议栈线程调用
   @param [in] thread_callback  回调函数
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_regist_thread_call(void (*thread_callback)(void)) */
#define ble_op_regist_thread_call(thread_callback)     \
	ble_user_cmd_prepare(BLE_CMD_REGIEST_THREAD, 1, thread_callback)

/**********************************************************************************

   @function
   @param [in]
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/



/**********************************************************************************

   @function  开关BLE搜索扫描，!!!注意：开搜索前必现先配置好搜索的参数
   @param [in] enable   0 or 1
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
   note:filter_duplicate 默认 为 1
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_scan_enable(u8 enable) */
#define ble_op_scan_enable(enable)     \
	ble_user_cmd_prepare(BLE_CMD_SCAN_ENABLE, 1, enable)

/**********************************************************************************

   @function  开关BLE搜索扫描，!!!注意：开搜索前必现先配置好搜索的参数
   @param [in] enable   0 or 1
   @param [in] filter_duplicate  0 or 1
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
   note:filter_duplicate 默认 为 1
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_scan_enable2(u8 enable,u8 filter_duplicate) */
#define ble_op_scan_enable2(enable,filter_duplicate)     \
	ble_user_cmd_prepare(BLE_CMD_SCAN_ENABLE2, 2, enable,filter_duplicate)

/**********************************************************************************
   @function 配置scan filter policy,default 0
   @param [in] type   Range: 0x00 to 0x03
   @return  see ble_cmd_ret_e
   !!!注意：设置的时候必须在 设置扫描参数 ble_op_set_scan_param 前配置好
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_scan_filter_policy(u8 type) */
#define ble_op_set_scan_filter_policy(type)     \
	ble_user_cmd_prepare(BLE_CMD_SET_HCI_CFG, 2,HCI_CFG_SCAN_FILTER_POLICY,type)

/**********************************************************************************

   @function   配置搜索参数
   @param [in] scan_type       搜索类型 Range: 0x00 to 0x01     (unit: 0.625ms)
   @param [in] scan_interval   搜索周期 Range: 0x0004 to 0x4000 (unit: 0.625ms)   >= scan_window
   @param [in] scan_window     搜索窗口 Range: 0x0004 to 0x4000 (unit: 0.625ms),  <= scan_interval
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_scan_param(u8 scan_type,u16 scan_interval,u16 scan_window) */
#define ble_op_set_scan_param(scan_type,scan_interval,scan_window)     \
	ble_user_cmd_prepare(BLE_CMD_SCAN_PARAM, 3, scan_type, scan_interval, scan_window)

/**********************************************************************************
   @function 配置creat filter policy,default 0
   @param [in] type   Range: 0x00 to 0x03
   @return  see ble_cmd_ret_e
   !!!注意：设置的时候必须在 设置创建连接参数 ble_op_create_connection 前配置好
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_set_create_filter_policy(u8 type) */
#define ble_op_set_create_filter_policy(type)     \
	ble_user_cmd_prepare(BLE_CMD_SET_HCI_CFG, 2,HCI_CFG_INITIATOR_FILTER_POLICY,type)

/**********************************************************************************

   @function  建立BLE创建连接监听
   @param [in] create_conn_param 连接参数
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_create_connection(struct create_conn_param_t * create_conn_param) */
#define ble_op_create_connection(create_conn_param)     \
	ble_user_cmd_prepare(BLE_CMD_CREATE_CONN, 1, create_conn_param)

/**********************************************************************************

   @function   取消BLE连接监听
   @param [in]
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_create_connection_cancel(void) */
#define ble_op_create_connection_cancel()     \
	ble_user_cmd_prepare(BLE_CMD_CREATE_CONN_CANCEL,0)

/**********************************************************************************

   @function   ble 主机搜索所有服务
   @param [in]
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_search_profile_all(void) */
#define ble_op_search_profile_all()     \
	ble_user_cmd_prepare(BLE_CMD_SEARCH_PROFILE, 2, PFL_SERVER_ALL, 0)

/**********************************************************************************

   @function   ble 主机搜索指定UUID16服务
   @param [in] uuid16   uuid
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_search_profile_uuid16(u16 uuid16) */
#define ble_op_search_profile_uuid16(uuid16)     \
	ble_user_cmd_prepare(BLE_CMD_SEARCH_PROFILE, 2, PFL_SERVER_UUID16, uuid16)

/**********************************************************************************

   @function   ble 主机搜索指定UUID128服务
   @param [in] uuid16   uuid128
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_search_profile_uuid128(const u8 *uuid128_pt) */
#define ble_op_search_profile_uuid128(uuid128_pt)     \
	ble_user_cmd_prepare(BLE_CMD_SEARCH_PROFILE, 2, PFL_SERVER_UUID128, uuid128_pt)

/**********************************************************************************

   @function   ble 主机 更新连接参数
   @param [in] con_handle 连接 con_handle,range：>0
   @param [in] con_param (全局变量地址)，连接参数
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/
/* ble_cmd_ret_e ble_op_conn_param_update(u16 con_handle,struct conn_update_param_t *con_param) */
#define ble_op_conn_param_update(con_handle,con_param)     \
	ble_user_cmd_prepare(BLE_CMD_ONNN_PARAM_UPDATA, 2, con_handle, con_param)


/**********************************************************************************

   @function
   @param [in]
   @param [in]
   @param [in]
   @param [in]
   @return    see ble_cmd_ret_e
 *********************************************************************************/


/**********************************************************************************

   @function   ble 从机 配置配对表(可以不设置,使用sdk默认值)
   @param [in] pair_devices_count 记录配对设备  range: 0~10,默认10
               若配置为0:则不使用配对表记录管理，不限制配对个数
   @param [in] is_allow_cover  是否允许循环覆盖记录  1 or 0,默认1
   @param [in]
   @param [in]
   @return    true or false
	note: 上电调用配置,若配置的个数跟之前不一样，默认清所有的配对表数据
	note: VM 掉电记录保护
 *********************************************************************************/
void ble_list_config_reset(u8 pair_devices_count, u8 is_allow_cover);


/**********************************************************************************

   @function   配置是否接受新设备请求配对,记录在VM,(可以不设置,使用sdk默认值)
   @param [in] enable  是否允许循环覆盖记录  1 or 0,默认1
   @param [in]
   @param [in]
   @param [in]
   @return    true or false
	note:VM 掉电记录保护
	note:
 *********************************************************************************/
bool ble_list_pair_accept(u8 enable);

/**********************************************************************************
   @function   绑定已配对的指定设备,清除其他配对设备
   @param [in] conn_addr        对方地址6bytes
   @param [in] conn_addr_type   对方地址类型range: 0~1
   @param [in]
   @param [in]
   @return    true or false
	note:VM 掉电记录保护
 *********************************************************************************/
bool ble_list_bonding_remote(u8 *conn_addr, u8 conn_addr_type);


/**********************************************************************************

   @function   ble 从机 清空配对表
   @param [in]
   @param [in]
   @return    true or false
	note:
 *********************************************************************************/
bool ble_list_clear_all(void);

/**********************************************************************************

   @function   ble 从机 检测连接地址是否在已配对表中
   @param [in] conn_addr        对方地址6bytes
   @param [in] conn_addr_type   对方地址类型range: 0~1
   @param [in]
   @param [in]
   @return    true or false
	note:
 *********************************************************************************/
bool ble_list_check_addr_is_exist(u8 *conn_addr, u8 conn_addr_type);


/**********************************************************************************

   @function   ble 从机 把设备从配对表中删除
   @param [in] conn_addr        对方连接地址6bytes
   @param [in] conn_addr_type   对方连接地址类型range: 0~1
   @param [in]
   @param [in]
   @return    true or false
	note:
 *********************************************************************************/
bool ble_list_delete_device(u8 *conn_addr, u8 conn_addr_type);


/**********************************************************************************

   @function   ble 从机 获取配对表中最后连接设备的 id_address (public address)
   @param [out] id_addr
   @param [in]
   @param [in]
   @return    true or false
	note:
 *********************************************************************************/
bool ble_list_get_last_id_addr(u8 *id_addr);


/**********************************************************************************

   @function   ble 从机 获取已配对设备连接地址对应的 id_address (public address)
   @param [in] conn_addr        对方连接地址6bytes
   @param [in] conn_addr_type   对方连接地址类型range: 0~1
   @param [out] id_addr
   @param [in]
   @param [in]
   @return    true or false
	note:
 *********************************************************************************/
bool ble_list_get_id_addr(u8 *conn_addr, u8 conn_addr_type, u8 *id_addr);

/**********************************************************************************

   @function   ble 从机 获取已配对设备的系统类型
   @param [in] conn_addr        对方连接地址6bytes
   @param [in] conn_addr_type   对方连接地址类型range: 0~1
   @param [out] remote_type_e
   @param [in]
   @param [in]
   @return    true or false
	note:
 *********************************************************************************/
bool ble_list_get_remote_type(u8 *conn_addr, u8 conn_addr_type, u8 *output_type);

/**********************************************************************************
   @function ble slave: att server 连接后主动发起请求MTU交换流程
   @param [in] handle  连接 con_handle,range：>0
   @param [in]
   @param [in]
   @return
 *********************************************************************************/
void att_server_set_exchange_mtu(u16 con_handle);

/**********************************************************************************
   @function ble slave: att server 使能流控功能
   @param [in] handle  连接 con_handle,range：>0
   @param [in] enable: 1 or 0
   @param [in]
   @return
	note: 蓝牙初始化后可调用
 *********************************************************************************/
void att_server_flow_enable(u8 enable);

/**********************************************************************************
   @function ble slave: att server 控制收数流控
   @param [in] handle  连接 con_handle,range：>0
   @param [in] hold_flag:1--停止收发数据，0--开始正常收发数
   @param [in]
   @return
	note: 必须先调用 att_server_flow_enable 使能流控控制,接口才能生效
 *********************************************************************************/
void att_server_flow_hold(hci_con_handle_t con_handle, u8 hold_flag);

/**********************************************************************************
   @function ble slave: server 配对连接时，检查对方操作系统
   @param [in] handle   连接 con_handle,range：>0
   @param [in] callback 检查完回调
   @param [in]
   @return
	note: 在第一次配对连接时调用，HCI_EVENT_ENCRYPTION_CHANGE 事件后
 *********************************************************************************/
void att_server_set_check_remote(u16 con_handle, void (*callback)(u16 con_handle, remote_type_e remote_type));


/**********************************************************************************
   @function   检测att模块是否支持多机
   @param [in] server_max
   @param [in] client_max
   @param [in]
   @return 0--success ,非0--fail
	note:
 *********************************************************************************/
int att_send_check_multi_dev(u8 server_max, u8 client_max);



/**********************************************************************************
   @function  可修改GATT服务的profile
   @param [in] profile_data
   @param [in]
   @param [in]
   @return 0--success ,非0--fail
	note: 蓝牙未连接状态下调用修改
 *********************************************************************************/
int att_server_change_profile(u8 const *profile_data);





























#endif

